home *** CD-ROM | disk | FTP | other *** search
/ Dynamic HTML Construction Kit / Dynamic HTML Construction Kit.iso / earthlink / nscomm / java40.jar / java / text / MessageFormat.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-11-03  |  8.0 KB  |  486 lines

  1. package java.text;
  2.  
  3. import java.util.Date;
  4. import java.util.Locale;
  5.  
  6. public class MessageFormat extends Format {
  7.    private Locale locale = Locale.getDefault();
  8.    private String pattern = "";
  9.    private Format[] formats = new Format[10];
  10.    private int[] offsets = new int[10];
  11.    private int[] argumentNumbers = new int[10];
  12.    private int maxOffset = -1;
  13.    private static final String[] typeList = new String[]{"", "", "number", "", "date", "", "time", "", "choice"};
  14.    private static final String[] modifierList = new String[]{"", "", "currency", "", "percent", "", "integer"};
  15.    private static final String[] dateModifierList = new String[]{"", "", "short", "", "medium", "", "long", "", "full"};
  16.  
  17.    public MessageFormat(String var1) {
  18.       this.applyPattern(var1);
  19.    }
  20.  
  21.    public void setLocale(Locale var1) {
  22.       this.locale = var1;
  23.    }
  24.  
  25.    public Locale getLocale() {
  26.       return this.locale;
  27.    }
  28.  
  29.    public void applyPattern(String var1) {
  30.       StringBuffer[] var2 = new StringBuffer[4];
  31.  
  32.       for(int var3 = 0; var3 < var2.length; ++var3) {
  33.          var2[var3] = new StringBuffer();
  34.       }
  35.  
  36.       int var4 = 0;
  37.       int var5 = 0;
  38.       boolean var6 = false;
  39.       int var7 = 0;
  40.  
  41.       for(int var8 = 0; var8 < var1.length(); ++var8) {
  42.          char var9 = var1.charAt(var8);
  43.          if (var4 == 0) {
  44.             if (var9 == '\'') {
  45.                if (var8 + 1 < var1.length() && var1.charAt(var8 + 1) == '\'') {
  46.                   var2[var4].append(var9);
  47.                   ++var8;
  48.                } else {
  49.                   var6 = !var6;
  50.                }
  51.             } else if (var9 == '{' && !var6) {
  52.                var4 = 1;
  53.             } else {
  54.                var2[var4].append(var9);
  55.             }
  56.          } else if (var6) {
  57.             var2[var4].append(var9);
  58.             if (var9 == '\'') {
  59.                var6 = false;
  60.             }
  61.          } else {
  62.             switch (var9) {
  63.                case '\'':
  64.                   var6 = true;
  65.                default:
  66.                   var2[var4].append(var9);
  67.                   break;
  68.                case ',':
  69.                   if (var4 < 3) {
  70.                      ++var4;
  71.                   } else {
  72.                      var2[var4].append(var9);
  73.                   }
  74.                   break;
  75.                case '{':
  76.                   ++var7;
  77.                   var2[var4].append(var9);
  78.                   break;
  79.                case '}':
  80.                   if (var7 == 0) {
  81.                      var4 = 0;
  82.                      this.makeFormat(var8, var5, var2);
  83.                      ++var5;
  84.                   } else {
  85.                      --var7;
  86.                      var2[var4].append(var9);
  87.                   }
  88.             }
  89.          }
  90.       }
  91.  
  92.       this.pattern = var2[0].toString();
  93.    }
  94.  
  95.    public String toPattern() {
  96.       int var1 = 0;
  97.       StringBuffer var2 = new StringBuffer();
  98.  
  99.       for(int var3 = 0; var3 <= this.maxOffset; ++var3) {
  100.          copyAndFixQuotes(this.pattern, var1, this.offsets[var3], var2);
  101.          var1 = this.offsets[var3];
  102.          var2.append('{');
  103.          var2.append(this.argumentNumbers[var3]);
  104.          if (this.formats[var3] != null) {
  105.             if (this.formats[var3] instanceof DecimalFormat) {
  106.                if (this.formats[var3].equals(NumberFormat.getInstance(this.locale))) {
  107.                   var2.append(",number");
  108.                } else if (this.formats[var3].equals(NumberFormat.getCurrencyInstance(this.locale))) {
  109.                   var2.append(",number,currency");
  110.                } else if (this.formats[var3].equals(NumberFormat.getPercentInstance(this.locale))) {
  111.                   var2.append(",number,percent");
  112.                } else if (this.formats[var3].equals(this.getIntegerFormat(this.locale))) {
  113.                   var2.append(",number,integer");
  114.                } else {
  115.                   var2.append(",number," + ((DecimalFormat)this.formats[var3]).toPattern());
  116.                }
  117.             } else if (this.formats[var3] instanceof SimpleDateFormat) {
  118.                if (this.formats[var3].equals(DateFormat.getDateInstance(2, this.locale))) {
  119.                   var2.append(",date");
  120.                } else if (this.formats[var3].equals(DateFormat.getDateInstance(3, this.locale))) {
  121.                   var2.append(",date,short");
  122.                } else if (this.formats[var3].equals(DateFormat.getDateInstance(2, this.locale))) {
  123.                   var2.append(",date,medium");
  124.                } else if (this.formats[var3].equals(DateFormat.getDateInstance(1, this.locale))) {
  125.                   var2.append(",date,long");
  126.                } else if (this.formats[var3].equals(DateFormat.getDateInstance(0, this.locale))) {
  127.                   var2.append(",date,full");
  128.                } else if (this.formats[var3].equals(DateFormat.getTimeInstance(2, this.locale))) {
  129.                   var2.append(",time");
  130.                } else if (this.formats[var3].equals(DateFormat.getTimeInstance(3, this.locale))) {
  131.                   var2.append(",time,short");
  132.                } else if (this.formats[var3].equals(DateFormat.getTimeInstance(2, this.locale))) {
  133.                   var2.append(",time,medium");
  134.                } else if (this.formats[var3].equals(DateFormat.getTimeInstance(1, this.locale))) {
  135.                   var2.append(",time,long");
  136.                } else if (this.formats[var3].equals(DateFormat.getTimeInstance(0, this.locale))) {
  137.                   var2.append(",time,full");
  138.                } else {
  139.                   var2.append(",date," + ((SimpleDateFormat)this.formats[var3]).toPattern());
  140.                }
  141.             } else if (this.formats[var3] instanceof ChoiceFormat) {
  142.                var2.append(",choice," + ((ChoiceFormat)this.formats[var3]).toPattern());
  143.             }
  144.          }
  145.  
  146.          var2.append('}');
  147.       }
  148.  
  149.       copyAndFixQuotes(this.pattern, var1, this.pattern.length(), var2);
  150.       return var2.toString();
  151.    }
  152.  
  153.    public void setFormats(Format[] var1) {
  154.       try {
  155.          this.formats = (Format[])var1.clone();
  156.       } catch (Exception var2) {
  157.       }
  158.    }
  159.  
  160.    public void setFormat(int var1, Format var2) {
  161.       this.formats[var1] = var2;
  162.    }
  163.  
  164.    public Format[] getFormats() {
  165.       try {
  166.          return (Format[])this.formats.clone();
  167.       } catch (Exception var1) {
  168.          return this.formats;
  169.       }
  170.    }
  171.  
  172.    public final StringBuffer format(Object[] var1, StringBuffer var2, FieldPosition var3) {
  173.       return this.format(var1, var2, var3, 0);
  174.    }
  175.  
  176.    public static String format(String var0, Object[] var1) {
  177.       MessageFormat var2 = new MessageFormat(var0);
  178.       return ((Format)var2).format(var1);
  179.    }
  180.  
  181.    public final StringBuffer format(Object var1, StringBuffer var2, FieldPosition var3) {
  182.       return this.format(var1, var2, var3, 0);
  183.    }
  184.  
  185.    public Object[] parse(String var1, ParsePosition var2) {
  186.       Object[] var3 = new Object[10];
  187.       int var4 = 0;
  188.       int var5 = var2.index;
  189.       ParsePosition var6 = new ParsePosition(0);
  190.  
  191.       for(int var7 = 0; var7 <= this.maxOffset; ++var7) {
  192.          int var8 = this.offsets[var7] - var4;
  193.          if (var8 != 0 && !this.pattern.regionMatches(var4, var1, var5, var8)) {
  194.             return null;
  195.          }
  196.  
  197.          var5 += var8;
  198.          var4 += var8;
  199.          if (this.formats[var7] == null) {
  200.             int var9 = var7 != this.maxOffset ? this.offsets[var7 + 1] : this.pattern.length();
  201.             int var10 = var1.indexOf(this.pattern.substring(var4, var9), var5);
  202.             if (var10 < 0) {
  203.                return null;
  204.             }
  205.  
  206.             var3[this.argumentNumbers[var7]] = var1.substring(var5, var10);
  207.             var5 = var10;
  208.          } else {
  209.             var6.index = var5;
  210.             var3[this.argumentNumbers[var7]] = this.formats[var7].parseObject(var1, var6);
  211.             if (var6.index == var5) {
  212.                return null;
  213.             }
  214.  
  215.             var5 = var6.index;
  216.          }
  217.       }
  218.  
  219.       int var12 = this.pattern.length() - var4;
  220.       if (var12 != 0 && !this.pattern.regionMatches(var4, var1, var5, var12)) {
  221.          return null;
  222.       } else {
  223.          var2.index = var5 + var12;
  224.          return var3;
  225.       }
  226.    }
  227.  
  228.    public Object[] parse(String var1) throws ParseException {
  229.       ParsePosition var2 = new ParsePosition(0);
  230.       Object[] var3 = this.parse(var1, var2);
  231.       if (var2.index == 0) {
  232.          throw new ParseException("MessageFormat parse error!", 0);
  233.       } else {
  234.          return var3;
  235.       }
  236.    }
  237.  
  238.    public Object parseObject(String var1, ParsePosition var2) {
  239.       return this.parse(var1, var2);
  240.    }
  241.  
  242.    public Object clone() {
  243.       try {
  244.          MessageFormat var1 = (MessageFormat)super.clone();
  245.          var1.formats = (Format[])this.formats.clone();
  246.  
  247.          for(int var2 = 0; var2 < this.formats.length; ++var2) {
  248.             if (this.formats[var2] != null) {
  249.                var1.formats[var2] = (Format)this.formats[var2].clone();
  250.             }
  251.          }
  252.  
  253.          var1.offsets = (int[])this.offsets.clone();
  254.          var1.argumentNumbers = (int[])this.argumentNumbers.clone();
  255.          return var1;
  256.       } catch (CloneNotSupportedException var3) {
  257.          throw new InternalError();
  258.       }
  259.    }
  260.  
  261.    public boolean equals(Object var1) {
  262.       if (this == var1) {
  263.          return true;
  264.       } else if (this.getClass() != var1.getClass()) {
  265.          return false;
  266.       } else {
  267.          MessageFormat var2 = (MessageFormat)var1;
  268.          return this.maxOffset == var2.maxOffset && this.pattern.equals(var2.pattern) && Utility.objectEquals(this.locale, var2.locale) && Utility.arrayEquals(this.offsets, var2.offsets) && Utility.arrayEquals(this.argumentNumbers, var2.argumentNumbers) && Utility.arrayEquals(this.formats, var2.formats);
  269.       }
  270.    }
  271.  
  272.    public int hashCode() {
  273.       return this.pattern.hashCode();
  274.    }
  275.  
  276.    private StringBuffer format(Object[] var1, StringBuffer var2, FieldPosition var3, int var4) {
  277.       int var5 = 0;
  278.  
  279.       for(int var6 = 0; var6 <= this.maxOffset; ++var6) {
  280.          var2.append(this.pattern.substring(var5, this.offsets[var6]));
  281.          var5 = this.offsets[var6];
  282.          int var7 = this.argumentNumbers[var6];
  283.          if (var7 >= var1.length) {
  284.             throw new IllegalArgumentException("Argument # > Arg length");
  285.          }
  286.  
  287.          Object var8 = var1[var7];
  288.          boolean var10 = false;
  289.          String var9;
  290.          if (this.formats[var6] != null) {
  291.             var9 = this.formats[var6].format(var8);
  292.             var10 = this.formats[var6] instanceof ChoiceFormat;
  293.          } else if (var8 instanceof Number) {
  294.             var9 = NumberFormat.getInstance(this.locale).format(var8);
  295.          } else if (var8 instanceof Date) {
  296.             var9 = DateFormat.getDateTimeInstance(3, 3, this.locale).format(var8);
  297.          } else {
  298.             if (!(var8 instanceof String)) {
  299.                System.out.println("Unknown object of type:" + var8.getClass().getName());
  300.                throw new IllegalArgumentException("Unknown argument");
  301.             }
  302.  
  303.             var9 = (String)var8;
  304.          }
  305.  
  306.          if (var10 && var9.indexOf(123) >= 0) {
  307.             MessageFormat var11 = new MessageFormat(var9);
  308.             var11.format(var1, var2, var3, var4);
  309.          } else {
  310.             var2.append(var9);
  311.          }
  312.       }
  313.  
  314.       var2.append(this.pattern.substring(var5, this.pattern.length()));
  315.       return var2;
  316.    }
  317.  
  318.    private void makeFormat(int var1, int var2, StringBuffer[] var3) {
  319.       try {
  320.          int var4 = Integer.parseInt(var3[1].toString());
  321.          if (var4 < 0 || var4 > 9) {
  322.             throw new NumberFormatException();
  323.          }
  324.  
  325.          this.maxOffset = var2;
  326.          this.offsets[var2] = var3[0].length();
  327.          this.argumentNumbers[var2] = var4;
  328.       } catch (Exception var10) {
  329.          throw new IllegalArgumentException("argument number too large at ");
  330.       }
  331.  
  332.       Object var5;
  333.       var5 = null;
  334.       label61:
  335.       switch (findKeyword(var3[2].toString(), typeList)) {
  336.          case 0:
  337.             break;
  338.          case 1:
  339.          case 2:
  340.             switch (findKeyword(var3[3].toString(), modifierList)) {
  341.                case 0:
  342.                   var5 = NumberFormat.getInstance(this.locale);
  343.                   break label61;
  344.                case 1:
  345.                case 2:
  346.                   var5 = NumberFormat.getCurrencyInstance(this.locale);
  347.                   break label61;
  348.                case 3:
  349.                case 4:
  350.                   var5 = NumberFormat.getPercentInstance(this.locale);
  351.                   break label61;
  352.                case 5:
  353.                case 6:
  354.                   var5 = this.getIntegerFormat(this.locale);
  355.                   break label61;
  356.                default:
  357.                   var5 = NumberFormat.getInstance(this.locale);
  358.  
  359.                   try {
  360.                      ((DecimalFormat)var5).applyPattern(var3[3].toString());
  361.                      break label61;
  362.                   } catch (Exception var9) {
  363.                      throw new IllegalArgumentException("Pattern incorrect or locale does not support formats, error at ");
  364.                   }
  365.             }
  366.          case 3:
  367.          case 4:
  368.             switch (findKeyword(var3[3].toString(), dateModifierList)) {
  369.                case 0:
  370.                   var5 = DateFormat.getDateInstance(2, this.locale);
  371.                   break label61;
  372.                case 1:
  373.                case 2:
  374.                   var5 = DateFormat.getDateInstance(3, this.locale);
  375.                   break label61;
  376.                case 3:
  377.                case 4:
  378.                   var5 = DateFormat.getDateInstance(2, this.locale);
  379.                   break label61;
  380.                case 5:
  381.                case 6:
  382.                   var5 = DateFormat.getDateInstance(1, this.locale);
  383.                   break label61;
  384.                case 7:
  385.                case 8:
  386.                   var5 = DateFormat.getDateInstance(0, this.locale);
  387.                   break label61;
  388.                default:
  389.                   var5 = DateFormat.getDateInstance(2, this.locale);
  390.  
  391.                   try {
  392.                      ((SimpleDateFormat)var5).applyPattern(var3[3].toString());
  393.                      break label61;
  394.                   } catch (Exception var8) {
  395.                      throw new IllegalArgumentException("Pattern incorrect or locale does not support formats, error at ");
  396.                   }
  397.             }
  398.          case 5:
  399.          case 6:
  400.             switch (findKeyword(var3[3].toString(), dateModifierList)) {
  401.                case 0:
  402.                   var5 = DateFormat.getTimeInstance(2, this.locale);
  403.                   break label61;
  404.                case 1:
  405.                case 2:
  406.                   var5 = DateFormat.getTimeInstance(3, this.locale);
  407.                   break label61;
  408.                case 3:
  409.                case 4:
  410.                   var5 = DateFormat.getTimeInstance(2, this.locale);
  411.                   break label61;
  412.                case 5:
  413.                case 6:
  414.                   var5 = DateFormat.getTimeInstance(1, this.locale);
  415.                   break label61;
  416.                case 7:
  417.                case 8:
  418.                   var5 = DateFormat.getTimeInstance(0, this.locale);
  419.                   break label61;
  420.                default:
  421.                   var5 = DateFormat.getTimeInstance(2, this.locale);
  422.  
  423.                   try {
  424.                      ((SimpleDateFormat)var5).applyPattern(var3[3].toString());
  425.                      break label61;
  426.                   } catch (Exception var7) {
  427.                      throw new IllegalArgumentException("Pattern incorrect or locale does not support formats, error at ");
  428.                   }
  429.             }
  430.          case 7:
  431.          case 8:
  432.             try {
  433.                var5 = new ChoiceFormat(var3[3].toString());
  434.                break;
  435.             } catch (Exception var6) {
  436.                throw new IllegalArgumentException("Choice Pattern incorrect, error at ");
  437.             }
  438.          default:
  439.             throw new IllegalArgumentException("unknown format type at ");
  440.       }
  441.  
  442.       this.formats[var2] = (Format)var5;
  443.       var3[1].setLength(0);
  444.       var3[2].setLength(0);
  445.       var3[3].setLength(0);
  446.    }
  447.  
  448.    private static final int findKeyword(String var0, String[] var1) {
  449.       var0 = var0.trim().toLowerCase();
  450.  
  451.       for(int var2 = 0; var2 < var1.length; ++var2) {
  452.          if (var0.equals(var1[var2])) {
  453.             return var2;
  454.          }
  455.       }
  456.  
  457.       return -1;
  458.    }
  459.  
  460.    NumberFormat getIntegerFormat(Locale var1) {
  461.       NumberFormat var2 = NumberFormat.getInstance(var1);
  462.       if (var2 instanceof DecimalFormat) {
  463.          DecimalFormat var3 = (DecimalFormat)var2;
  464.          ((NumberFormat)var3).setMaximumFractionDigits(0);
  465.          var3.setDecimalSeparatorAlwaysShown(false);
  466.          ((NumberFormat)var3).setParseIntegerOnly(true);
  467.       }
  468.  
  469.       return var2;
  470.    }
  471.  
  472.    private static final void copyAndFixQuotes(String var0, int var1, int var2, StringBuffer var3) {
  473.       for(int var4 = var1; var4 < var2; ++var4) {
  474.          char var5 = var0.charAt(var4);
  475.          if (var5 == '{') {
  476.             var3.append("'{'");
  477.          } else if (var5 == '\'') {
  478.             var3.append("''");
  479.          } else {
  480.             var3.append(var5);
  481.          }
  482.       }
  483.  
  484.    }
  485. }
  486.